const program = require('commander');
const path = require('path');
const { version, CI_NAME } = require('./constants');

// 指令命令的集合
const mapAction = {
  // 创建模版
  create: {
    alias: 'c',
    description: '创建项目',
    options: [
      '-f, --force, 如果存在同名项目，则覆盖',
    ],
    examples: [
      `${CI_NAME} create <project-name>`,
    ],
  },
  // 定义变量
  // config: {
  //   // 配置文件
  //   alias: 'conf',
  //   description: '定义项目变量',
  //   examples: [`${CI_NAME} config set <k> <v>`, `${CI_NAME} config get <k>`],
  // },
};

// 配置命令
Reflect.ownKeys(mapAction).forEach((action) => {
  const p = program
    // command()的第一个参数为命令名称。命令参数可以跟在名称后面，
    // 参数为必选的（尖括号表示）、可选的（方括号表示）
    .command(action)
    .description(mapAction[action].description);

  if (mapAction[action].options) {
    mapAction[action].options.forEach((o) => {
      p.option(o);
    });
  }

  p.action((option) => {
    require(path.resolve(__dirname, 'commands', action))(option, ...process.argv.slice(3));
  });
});

// program
//   // command()的第一个参数为命令名称。命令参数可以跟在名称后面，
//   // 参数为必选的（尖括号表示）、可选的（方括号表示）
//   .command('create <app-name>')
//   .description('创建项目')
//   .option('-f, --force, 如果存在同名项目，则覆盖')
//   .action((name, options, cmd) => {
//     console.log(name, options);
//   });

// --help时打印examples信息
program.on('--help', () => {
  console.log('Examples:');
  Reflect.ownKeys(mapAction).forEach((action) => {
    mapAction[action].examples.forEach((example) => {
      console.log(`  ${example}`);
    });
  });
});

program
  .version(version, '-V, --version', '输出输出版本号')
  .helpOption('-e, --help', '帮助信息')
  .usage('<comand> [option]')
  // 解析用户执行命令传入的参数
  .parse(process.argv);
